package com.gsbelarus.gedemin.lib.ui.fragment;

import android.content.res.Configuration;
import android.os.Parcelable;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.gsbelarus.gedemin.lib.R;

/**
 * Предок всех фрагментов с ListView
 * Выполняемые задачи:
 * 1. Создает View со списком.
 * 2. Считывает все возможные параметры пришедшие с других форм.
 * 3. Создает слушатель для элеменов списка.
 * 4. Организовывает доступ к БД в новом потоке.
 * Создание и инициализация адаптера списка, инициализация Header и считывание данных
 * должны быть реализованы в классе наследнике.
 * 5. Во время загрузки отображает ProgressBar, если он присутсвтует в View фрагмента наследника.
 */
abstract public class ListFragmentModel extends FragmentModel {

    /**
     * Объект для сохранения позиции listView. Сохраняется и восстанавливается после смены ориентации
     */
    private Parcelable state = null;

    /**
     * ListView для отображения произвольных данных, в произвольных layout,
     * которые оределяются в классах наследниках
     */
    protected ListView list;

    /**
     * Вызывается при клике на элемент ListView
     */
    abstract public void onListItemClick(AdapterView<?> adapterView, View view, int position, long id);

    /**
     * Чтение данных из БД в новом потоке
     */
    @Override
    abstract public void readDataBase();

    /**
     * Метод вызывается после чтения данных из БД или при смене ориентации экрана.
     * Может быть вызван до окончания выполнения потока для запроса данных из БД, поэтому следует проверять данные на null.
     * Служит для инициализации View данными
     *
     * @param rootView корневое View
     */
    @Override
    abstract public void initView(View rootView);

    @Override
    public int getViewResource() {
        return R.layout.frame_list_sums;
    }

    /**
     * Если нужно переопределяется в классе наследнике
     *
     * @return адаптер для списка
     */
    public ArrayAdapter getAdapter() {
        return null;
    }

    /**
     * Вызывается при создании View или при смене ориентации экрана.
     * Может быть переопределен в классе наследнике
     *
     * @param rootView корневое View
     */
    @Override
    public void onCreateViewFragment(View rootView) {
        super.onCreateViewFragment(rootView);

        /** Создание списка */
        list = (ListView) rootView.findViewById(R.id.list);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                onListItemClick(adapterView, view, position, id);
            }
        });
        list.setFastScrollEnabled(true);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        /** при смене ориентации пересоздаем и инициализируем rootView */
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
                newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
            if (list != null)
                state = list.onSaveInstanceState();
        super.onConfigurationChanged(newConfig);
    }

    /**
     * Вызывается после инициализации View
     *
     * @param rootView корневое View
     */
    @Override
    public void afterInitView(View rootView) {
        super.afterInitView(rootView);
        if (state != null && list != null)
            list.onRestoreInstanceState(state);
    }
}